package com.tedu.api.list;

import org.junit.Test;

import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;

/**Collection集合下   子集合【叫队列】  包位置：java.util
 * Queue    队列    单端队列
 * Deque    队列    双端队列    ”Deque接口-- 继承 --Queue接口“
 * 作用：保存数据，有序的存储和处理，功能：数据缓冲或者多线程协调工作！
 *
 * 队伍实现类：
 *
 *
 * LinkedList：双向链表
*/
 public class QueueAPI {
    //Queue 队列 单端队列
    @Test
    public void testQueue() {
        //创建队列--多态--LinkedList
        Queue<String> queue = new LinkedList<>();
        /**
         * offer()  ----add() 一样
         * 作用：入队操作，对尾追加元素
         */
        queue.offer("大梦想家");
        queue.offer("信仰之名");
        queue.offer("魔法城堡");
        queue.offer("青春修炼手册");
        System.out.println("Queue队列：" + queue);
        /**
         * poll()
         * 作用:出队操作，获取队首元素，并且删除队列中的队首
         * peek()
         * 作用：出队操作，获取队首元素元素，不删除队列中队首
         */
        queue.poll();  //删除队首元素
        System.out.println("Queue队列" + queue);
        String str = queue.peek();
        System.out.println("队首元素" + str);
        System.out.println("Queen队列" + queue);
        /**
         * 需求：1.遍历队列---while---只遍历一次队列【队列元素消失】
         *      提示：while 条件：拿到队列中总长度
         * 需求：2.编列队列--增强for--队列元素不消失
         *      提示：for 条件：E e 队列
         */
        // while (queue.size()>0) {  //true:队列总数>0 队列有元素 遍历
        //str=queue.poll(); //获取队首、删除队列中的对首
        //System.out.println("获取队列元素"+str);

        //}
        //System.out.println("queue队列元素"+queue);
        /**
         * 需求：2.遍历队列--增强for--队列元素不消失
         *            提示：for 条件：E e：数组泛型/集合泛型：数组引用 /集合引用
         */

        for (String e : queue) { // 增强for---底层Iterator遍历
                System.out.println("队列元素" + e);
            }
            System.out.println("Queue队列" + queue);


        }
        //Deque  队列 双端队列---继承---单端队列

        @Test
        public void testDeque() {
            // 创建Deque 双端队列 方法基本一致 部分方法不一致
            Deque<String> deque = new LinkedList<>();
            deque.offer("王俊凯"); deque.offer("王源");
            deque.offer("易烊千玺"); deque.offer("严浩翔");
            System.out.println("队端队列"+deque);
            //offerFirst()  队首添加元素 OfferLast() 队尾添加元素
            deque.offerFirst("左航"); deque.offerFirst("左奇函");
            System.out.println("双端队列【首尾添加元素】"+deque);
            //get



        }
    /**
     * 找结构:业务中如果有后退【撤销】情况使用栈结构
     * 双端队列支持栈结构---提供相应的方法实现栈结构
     */
    @Test
    public void testStack(){
        //创建双端队列---支持栈结构
        Deque<String> stack=new LinkedList<>();
        /**
         * push() Deque 独有的方法--支持栈结构
         * ---offer:Queue---add:Collection接口 【添加】
         * 作用：【添加：往栈压入一个元素】压栈元素
         *
         */
        stack.push("花园宝宝");
        stack.push("大耳朵图图");
        stack.push("喜羊羊与灰太狼");
        stack.push("熊出没");
        System.out.println("栈结构："+stack);
        /**
         * pop() 出栈一个伪元素   --pollLast类似【拿先入后出，最后一个压栈元素】
         *
         */
        String last=stack.pop();
        System.out.println("出栈伪元素："+last);
        System.out.println("栈结构"+stack);
        /**
         * 1.便利栈结构---while---元素出栈，队列需要清空
         * 2.便利栈结构--增强for--元素遍历成功
         */
        while (stack.size()>0){
            last=stack.poll();
            System.out.println("获取栈"+last);
        }
        System.out.println("stack元素"+stack);
        for (String e:stack){
            System.out.println("栈元素"+e);

        }
        System.out.println("Stack队列"+stack);

    }
    //pop poll peek 区别
    //poll 出队操作，获取队首元素，并且删除队列中队首
    //peek 出队操作，获取队首元素，不删除队列中元素
    //pop 出栈一个伪元素并删除

}

